#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

void Print(sigset_t &pending)
{
    std::cout << "curr process[" << getpid() << "]pending: ";
    for(int sig = 31; sig > 0; sig--)
    {
        if(sigismember(&pending, sig))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

// 当前如果正在对n号信号进行处理，默认n号信号会被自动屏蔽
// 对n号信号处理完成的时候，会自动解除对n号信号的屏蔽
// 为什么？系统不允许递归调用n号信号，在处理信号时不允许其他信号中断
void handler(int signum)
{
    std::cout << "get a sig: " << signum << std::endl;
    while(true)
    {
        sigset_t pending;
        sigpending(&pending);

        Print(pending);

        sleep(1);
        // sleep(30);
        // break;
    }
    // exit(1);
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    // 如果你还想处理2号(OS对2号自动屏蔽)，同时对其他信号也进行屏蔽
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    act.sa_flags = 0;

    for(int i = 0; i <= 31; i++)
        sigaction(i, &act, &oact);

    while(true)
    {
        std::cout << "I am a process, pid: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}